package com.szholly.data.general;

import java.util.List;

import com.szholly.data.common.delegate.*;

/**
 * 定义工作空间接口
 */
public interface IWorkspace extends IWorkspaceInfo {

	/**
	 * 开始编辑
	 */
	void startEditing();

	/**
	 * 停止编辑
	 */
	void stopEditing(boolean saveEdits);

	/**
	 * 当前是否处于编辑状态
	 */
	boolean isBeingEdited();

	/**
	 * 执行SQL语句返回查询结果IDataReader
	 * 
	 * @param strSql
	 * @param para
	 * @param dataDelegate
	 */
	<T extends RowBase> void getDataReader(Class<T> c, String strSql, GlobalParameter[] para,
                                           DataReaderDelegate dataDelegate);

	/**
	 * 执行SQL语句返回查询结果IDataReader
	 * 
	 * @param table
	 * @param queryFilter
	 * @param dataDelegate
	 */
	<T extends RowBase> void getDataReader(Class<T> c, ITable table, IQueryFilter queryFilter,
                                           DataReaderDelegate dataDelegate);

	/**
	 * 执行SQL语句返回查询结果IDataReader
	 * 
	 * @param table
	 * @param queryMap
	 * @param dataDelegate
	 */
	<T extends RowBase> void getDataReader(Class<T> c, ITable table, IQueryMap queryMap,
                                           DataReaderDelegate dataDelegate);

	/**
	 * 返回DataReader数据
	 */
	<T extends RowBase> void getDataReader(Class<T> c, ITable table, RowBase queryFilter,
                                           DataReaderDelegate dataDelegate);

	/**
	 * 执行SQL语句返回查询结果object
	 * 
	 * @param sqlString
	 * @param para
	 * @return
	 */
	Object getExecuteScalar(String sqlString, GlobalParameter[] para);

	/**
	 * 执行SQL语句返回查询结果object
	 * 
	 * @param queryFilter
	 * @return
	 */
	Object getExecuteScalar(ITable table, IQueryFilter queryFilter);

	/**
	 * 执行SQL语句返回查询结果object
	 * 
	 * @param queryFilter
	 * @return
	 */
	Object getExecuteScalar(ITable table, IQueryMap queryFilter);

	/**
	 * 执行SQL语句返回查询结果object
	 * 
	 * @param queryFilter
	 * @return
	 */
	Object getExecuteScalar(ITable table, RowBase queryFilter);

	/**
	 * 获取实体类，根据实体信息
	 */
	<T extends RowBase> T getEntity(Class<T> c, ITable table, RowBase queryFilter);

	/**
	 * 获取实体类，根据查询信息
	 * 
	 * @param queryFilter
	 * @return
	 */
	<T extends RowBase> T getEntity(Class<T> c, ITable table, IQueryFilter queryFilter);

	/**
	 * 获取实体类，根据查询信息
	 * 
	 * @param queryFilter
	 * @return
	 */
	<T extends RowBase> T getEntity(Class<T> c, ITable table, IQueryMap queryFilter);

	/**
	 * 执行SQL语句返回查询结果List<RowBase>
	 * 
	 * @param sqlString
	 * @param para
	 * @return
	 */
	<T extends RowBase> List<T> getEntityList(Class<T> c, String sqlString,
                                              GlobalParameter[] para);

	/**
	 * 执行SQL语句返回查询结果List<RowBase>
	 * 
	 * @param queryFilter
	 * @return
	 */
	<T extends RowBase> List<T> getEntityList(Class<T> c, ITable table,
                                              IQueryFilter queryFilter);

	/**
	 * 执行SQL语句返回查询结果List<RowBase>
	 * 
	 * @param queryFilter
	 * @return
	 */
	<T extends RowBase> List<T> getEntityList(Class<T> c, ITable table,
                                              IQueryMap queryFilter);

	/**
	 * 执行SQL语句返回查询结果List<RowBase>
	 * 
	 * @param row
	 * @return
	 */
	<T extends RowBase> List<T> getEntityList(Class<T> c, ITable table, RowBase row);

	/**
	 * 分页查询
	 * 
	 * @param sql
	 * @param para
	 * @param pageInfo
	 * @return
	 */
	<T extends RowBase> List<T> pageSelect(Class<T> c, String sql, GlobalParameter[] para,
                                           PageInfo pageInfo);

	/**
	 * 分页查询
	 * 
	 * @param table
	 * @param queryFilter
	 * @param pageInfo
	 * @return
	 */
	<T extends RowBase> List<T> pageSelect(Class<T> c, ITable table,
                                           IQueryFilter queryFilter, PageInfo pageInfo);

	/**
	 * 分页查询
	 * 
	 * @param table
	 * @param queryFilter
	 * @param pageInfo
	 * @return
	 */
	<T extends RowBase> List<T> pageSelect(Class<T> c, ITable table,
                                           IQueryMap queryFilter, PageInfo pageInfo);

	/**
	 * 分页查询
	 * 
	 * @param tableName
	 * @param queryFilter
	 * @param pageInfo
	 * @return
	 */
	<T extends RowBase> List<T> pageSelect(Class<T> c, ITable table,
                                           RowBase queryFilter, PageInfo pageInfo);

	/**
	 * 获取某列的最大值
	 * 
	 * @param fieldName
	 * @param otherCondition
	 * @param paras
	 * @return
	 */
	long getSpecFieldMaxValue(ITable table, String fieldName,
                              String otherCondition, GlobalParameter[] paras);

	/**
	 * 获取某列的最小值
	 * 
	 * @param fieldName
	 * @param otherCondition
	 * @param paras
	 * @return
	 */
	long getSpecFieldMinValue(ITable table, String fieldName,
                              String otherCondition, GlobalParameter[] paras);

	/**
	 * 获取下一个要素，如果没有返回null
	 * 
	 * @param t
	 * @param byFieldName
	 * @param whereString
	 * @param orderByType
	 * @param addCaptionField
	 * @return
	 */
	<T extends RowBase> T getNextEntity(Class<T> c, ITable table, RowBase t,
                                        String byFieldName, String whereString, OrderByType orderByType,
                                        boolean addCaptionField);

	/**
	 * 获取上一个要素，如果没有返回null
	 * 
	 * @param t
	 * @param byFieldName
	 * @param whereString
	 * @param orderByType
	 * @param addCaptionField
	 * @return
	 */
	<T extends RowBase> T getPerEntity(Class<T> c, ITable table, RowBase t,
                                       String byFieldName, String whereString, OrderByType orderByType,
                                       boolean addCaptionField);

	/**
	 * 保存对象
	 * 
	 * @param row
	 */
	void save(ITable table, RowBase row);

	/**
	 * 批量保存对象
	 */
	<T extends RowBase> void save(ITable table, List<T> rowList);

	/**
	 * 插入对象
	 * 
	 * @param row
	 */
	void insert(ITable table, RowBase row);

	/**
	 * 插入对象
	 * 
	 * @param row
	 */
	<T extends RowBase> void insert(ITable table, List<T> entity);

	/**
	 * 更新或添加行
	 * 
	 * @param entity
	 * @return
	 */
	void update(ITable table, RowBase entity);

	/**
	 * 更新或添加行
	 * 
	 * @param entity
	 * @return
	 */
	<T extends RowBase> void update(ITable table, List<T> entity);

	/**
	 * 更新数据
	 * 
	 * @param updateFilter
	 */
	void update(ITable table, IUpdateFilter updateFilter);

	/**
	 * 更新数据
	 * 
	 * @param updateFilter
	 */
	void update(ITable table, IUpdateMap updateFilter);

	/**
	 * 删除表记录
	 */
	void delete(ITable table, IQueryFilter queryFilter);

	/**
	 * 删除表记录
	 * 
	 * @param queryFilter
	 */
	void delete(ITable table, IQueryMap queryFilter);

	/**
	 * 删除表记录
	 */
	void delete(ITable table, RowBase row);

	/**
	 * 执行SQL语句返回影响行数
	 * 
	 * @param sqlString
	 * @param para
	 * @return
	 */
	int executeSql(String sql, GlobalParameter[] para);

	/**
	 * 批量执行SQL
	 * 
	 * @param sql
	 * @param paras
	 */
	void executeSql(String sql, List<GlobalParameter[]> paras);

	/**
	 * 获取得到一个表的自动增值SQL
	 */
	String getAutoSql(ITable table, String fieldName);

	/**
	 * 获取表或视图字段是否存在
	 * 
	 * @param name
	 * @param fieldName
	 * @return
	 */
	boolean fieldExist(String name, String fieldName);

	/**
	 * 确定数据对象是否存在
	 * 
	 * @param objName
	 * @return
	 */
	boolean objectExist(String objName);

	/**
	 * 获取数据库对象元数据
	 * 
	 * @param objName
	 * @return
	 */
	ITableInfo getTableMetadate(String objName);

	/**
	 * 获取数据库对象名称
	 * 
	 * @param objName
	 * @return
	 */
	TableType getObjectType(String objName);

	/**
	 * 获取指定对象名称集
	 * 
	 * @param tableType
	 * @return
	 */
	String[] getObjects(TableType tableType);

	/**
	 * 删除数据对象
	 * 
	 * @param tableType
	 * @param objName
	 */
	void deleteObject(TableType tableType, String objName);

	/**
	 * 重命名表
	 * 
	 * @param oldTableName
	 * @param newTableName
	 */
	void rename(String oldTableName, String newTableName);

	/**
	 * 根据元数据创建物理表
	 * 
	 * @param tableInfo
	 * @param tableName
	 */
	void createTable(ITableInfo tableInfo, String tableName);

	/**
	 * 根据元数据更新物理表结构
	 * 
	 * @param tableInfo
	 * @param tableName
	 */
	void updateTable(ITableInfo tableInfo, String tableName);

	/**
	 * 创建视图
	 * 
	 * @param viewName
	 * @param selectSql
	 * @param isStatic
	 */
	void createOrUpdateView(String viewName, String selectSql, boolean isStatic);

	/**
	 * 关闭对象
	 */
	void close();
}
